package laboratorio5;

/**
 *
 * @author ROGER DIAZ
 * esta pila trabaja igual que la de vectores pero en vez de usar la libreria de stack usa la clase lista que cree.
 */
public class PilaLista implements iPila {
    protected int lenghtline;
    Lista List1= new Lista();
    Lista List2= new Lista();
    Lista List3= new Lista();
    
    public PilaLista(){
}    
    
public void push(StringBuffer item){
    StringBuffer line=item;
    for(int i=0; i<lenghtline; i++){
        String charac=line.substring(i, i+1);
        List1.pusht(charac);
    }
}

public void setLengthline(int largo){
         lenghtline=largo;
     }



//Este metodo es el que hace todo el proceso de calculo Postfix
//este se va a ir usando por cada linea 

    public void operar(){
    int cantpila2=0;
    //mientras hayan valores en la pila 1, la cual se uso para guardar lo que se extrajo de una X linea
    //se entra al ciclo para ver que hacer con los valores que hayan
    while(List1.largo()!=0){
        try{
        //entonces primero se saca de la pila uno para ver que es y operarlo
        String termino = List1.popt();
        //si es el signo de suma
        switch (termino) {
            case "+":
                //se necesita que por lo menos hayan dos cosas para operar en la pila 2
                //por lo que se controla con esta variable
                while(cantpila2>=2){
                    //se saca un valor y se hace entero
                int num1=Integer.parseInt(List2.popt());
                //se saca el otro valor y se hace entero
                int num2=Integer.parseInt(List2.popt());
                //se operan
                int total= num1 + num2;
                //se guarda otra vez en pila dos para operarlo con lo que venga
                List2.pusht(Integer.toString(total));
                //se le resta al contador ya que dos valores se hacen uno en la operacion
                cantpila2--;
                }
                break;
            case "-":
                //se necesita que por lo menos hayan dos cosas para operar en la pila 2
                //por lo que se controla con esta variable
                while(cantpila2>=2){
                 //se saca un valor y se hace entero
                int num1=Integer.parseInt(List2.popt());
                //se saca el otro valor y se hace entero
                int num2=Integer.parseInt(List2.popt());
                //se operan
                int total= num1 - num2;
                //se guarda otra vez en pila dos para operarlo con lo que venga
                List2.pusht(Integer.toString(total));
                //se le resta al contador ya que dos valores se hacen uno en la operacion
                cantpila2--;
            }   break;
            case "*":
                //se necesita que por lo menos hayan dos cosas para operar en la pila 2
                //por lo que se controla con esta variable
                while(cantpila2>=2){
                 //se saca un valor y se hace entero
                 int num1=Integer.parseInt(List2.popt());
                 //se saca el otro valor y se hace entero
                 int num2=Integer.parseInt(List2.popt());
                 //se operan
                    int total= num1 * num2;
                    //se guarda otra vez en pila dos para operarlo con lo que venga
                    List2.pusht(Integer.toString(total));
                     //se le resta al contador ya que dos valores se hacen uno en la operacion
                    cantpila2--;
                }
                break;
            case "/":
                //se necesita que por lo menos hayan dos cosas para operar en la pila 2
                //por lo que se controla con esta variable
                while(cantpila2>=2){
                //se saca un valor y se hace entero
                int num1=Integer.parseInt(List2.popt());
                //se saca el otro valor y se hace entero
                int num2=Integer.parseInt(List2.popt());
                //se operan
                    int total= num1 / num2;
                    //se guarda otra vez en pila dos para operarlo con lo que venga
                    List2.pusht(Integer.toString(total));
                    //se le resta al contador ya que dos valores se hacen uno en la operacion
                    cantpila2--;
                }
                break;
            default:
                try{
                    //se verifica si es numero al tratar de convertirlo
                    int esnumero=Integer.parseInt(termino);
                    //suponiendo que no da error en la conversion se comprueba
                    //por lo que se guarda
                    List2.pusht(termino);
                    //se aumenta la cantidad de numeros que tiene pila dos
                    cantpila2++;
                }
                catch(Exception e){
                }
                break;
        }


    }
    
    catch(Exception e){
}

}
                //al haber trabajado todo lo que habia en la linea lo manda a la pila 3 que es donde estaran
    //los resultados de cada linea
        List3.pusht(List2.getUltimo());
    }
//Este metodo va a ir imprimiendo el resultado de cada una de las lineas
    public void imprimirPila(){
        System.out. println(List3.imprimir());
}
    
    public void clear(){
        List1.limpiar();
    }
       
}
